<!DOCTYPE html>
<html lang="en">
  <head><meta name="generator" content="Hexo 3.9.0">
    <meta charset="utf-8">

    <title>easy java document | easy-java </title>
    <meta name="description" content>
    <meta name="viewport" content="width=device-width, initial-scale=1">

    

    <!-- fonts -->
    <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:400,700" rel="stylesheet">
    <link href="//fonts.googleapis.com/css?family=Ubuntu:300,400,500,600,700" rel="stylesheet">

    <!-- stylesheets -->
    <link rel="stylesheet" href="/ejdoc/style/doc.css">

    <!-- favicon -->
    <link rel="icon" href="/ejdoc/images/favicon.ico">

    

  </head>
  <body>

   <script>window.__INITIAL_STATE__ = {"page":{"title":"easy-java","path":"function1.html"},"data":{"navigation":{"logo":{"text":"Easy Java","type":"link","path":"index.html"},"main":[{"text":"工作流与业务流集合","type":"link","path":"wf3.html"},{"text":"一对多关联V2.0","type":"link","path":"o2m.html"}]},"navigation.yaml":"{\n  \"logo\": {\n    \"text\": \"Easy Java\",\n    \"type\": \"link\",\n    \"path\": \"index.html\"\n  },\n  \"main\": [\n    {\n        \"text\": \"如何让你的项目快人N步?\",\n        \"type\": \"link\",\n        \"path\": \"index.html\"\n    },\n    {\n        \"text\": \"起步（从无到有）\",\n        \"type\": \"link\",\n        \"path\": \"build-code.html\"\n    },\n    {\n        \"text\": \"项目演示地址\",\n        \"type\": \"link\",\n        \"path\": \"show.html\"\n    },\n    {\n        \"text\": \"安装\",\n        \"type\": \"link\",\n        \"path\": \"install.html\"\n    },\n    {\n        \"text\": \"功能介绍\",\n        \"type\": \"link\",\n        \"path\": \"function1.html\"\n    },\n    {\n        \"text\": \"动态工作流-内置表单\",\n        \"type\": \"link\",\n        \"path\": \"workflow1.html\"\n    },\n    {\n        \"text\": \"动态工作流-外置表单\",\n        \"type\": \"link\",\n        \"path\": \"workflow2.html\"\n    },\n    {\n        \"text\": \"分布式定时任务\",\n        \"type\": \"link\",\n        \"path\": \"timer.html\"\n    },\n    {\n        \"text\": \"升级日志\",\n        \"type\": \"link\",\n        \"path\": \"log-20200517.html\"\n    },\n    {\n        \"text\": \"计划\",\n        \"type\": \"link\",\n        \"path\": \"future.html\"\n    },\n    {\n        \"text\": \"有Bug及时发我完善\",\n        \"type\": \"label\"\n    }\n  ]\n}\n"},"config":{"timezone":"UTC","root":"/ejdoc/","time_format":"HH:mm:ss","theme":"../node_modules/hexo-theme-doc","theme_config":{"swagger_ui":{"version":2,"permalinks":true,"api_explorer":true,"download":"Download specification","show_extensions":false,"deep_linking":true,"display_operation_id":false,"doc_expansion":"none"},"search":{"skip":false,"background":false,"route":"/lunr.json"},"favicon":"images/favicon.ico"}}}</script>

    <div id="react-navigation-root"><div class="doc-navigation" data-reactroot><nav class="doc-navbar"><a href="/ejdoc/index.html" class="doc-navbar__logo"><img src="/ejdoc/images/logo.png" class="doc-navbar__logo__img"><span class="doc-navbar__logo__text">Easy Java</span></a><i class="dc-icon dc-icon--close dc-icon--interactive doc-sidebar-close doc-navbar__sidebar-close doc-navbar__sidebar-close--desktop"></i><i class="dc-icon dc-icon--menu dc-icon--interactive doc-sidebar-toggle doc-navbar__sidebar-toggle"></i></nav><nav class="doc-sidebar"><div class="doc-sidebar__vertical-menu"><i class="dc-icon dc-icon--menu dc-icon--interactive doc-sidebar-toggle doc-sidebar-toggle--primary doc-sidebar__vertical-menu__item"></i><i class="dc-icon dc-icon--search dc-icon--interactive doc-sidebar__vertical-menu__item doc-sidebar__vertical-menu__item--primary"></i></div><div class="doc-sidebar-content"><div class="doc-sidebar__search-form"></div><ul class="doc-sidebar-list"></ul></div></nav></div></div>
    <div class="doc-content">
  <div class="dc-page">
    <div class="dc-card">
      <div id="react-search-results-root"></div>
      <div id="page-content" class="doc-formatting">
        <p><strong>以下功能，是上线第一版功能介绍，后续升级功能，见<a href="./log.html">升级日志</a></strong></p>
<h2 id="单表配置"><a href="#单表配置" class="headerlink" title="单表配置"></a>单表配置</h2><pre><code>打开菜单“开发者工具/模板管理”， 点击“源码生成器”按钮，输入表名，点“扫库生成源码”，系统将自动读取数据库表和字段信息进行录入，建立模板。
参考动画说明，见本文档目录：起步。
</code></pre><h2 id="多表配置"><a href="#多表配置" class="headerlink" title="多表配置"></a>多表配置</h2><pre><code>以部门与公司之间的多对一关系为例;
1，在模板管理中找到相应部门模板记录，如：tmpt_auth_dept，点击编辑；
2，修改表sql字段：
修改前：tmpt_auth_dept t1
修改后：tmpt_auth_dept t1 left join tmpt_auth_company t2 on t1.company_id=t2.id
内连接可用inner join， 一定要有join；
3，点击该条记录后的列管理；
4，在列管理中，点击“自动同步数据库”，系统将自动加载tmpt_auth_company的字段信息；
5，打开“/预览/部门管理”菜单，查看成果，可见公司信息以追加在部门信息后面；
6，如需继续调整列的相关特征；
如，列宽度，可直接拖动列间隔线；列合计、冻结、是否隐藏等，点列管理调整；
7，最后点生成源码; 
8，生成的源码在base微服务中,重启base微服务。
</code></pre><h2 id="树结构"><a href="#树结构" class="headerlink" title="树结构"></a>树结构</h2><pre><code>目前只支持表内关联树，可无限循环，表中关联外键名称必须是表名+&apos;_id&apos;， 以部门为例：
1，表名：tmpt_auth_dept， 主键是:id, 外键是：tmpt_auth_dept_id;
2，打开“/预览/部门管理”菜单，点击“模板配置/复杂结构”，将tree.enabel=true，tree.label=&apos;表字段名称&apos;，保存退出；
复杂结构：是json对象存储，如下所示：
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="string">"tree"</span>: &#123;</span><br><span class="line">    <span class="string">"desc"</span>: <span class="string">"树结构，默认是自动寻找‘表名_id’字段作外键，生成自关联树"</span>,</span><br><span class="line">    <span class="string">"enable"</span>: <span class="string">"开启?true:false"</span>,</span><br><span class="line">    <span class="string">"label"</span>: <span class="string">"作为树的显示名称"</span>,</span><br><span class="line">    <span class="string">"fKeyName"</span>: <span class="string">"自关联外键名称。无则自动寻找‘表名_id’字段作外键。（暂未实现）"</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

3，点击生成源码；
4，打开“/源码/部门管理”菜单，看成果；
5，多出来几个树菜单：Tree、TreeTable
</code></pre><h2 id="侧边树查询"><a href="#侧边树查询" class="headerlink" title="侧边树查询"></a>侧边树查询</h2><pre><code>与“树结构”说明一样，打开“模板配置/复杂结构”，修改asideTree节点。
此处以部门与员工一对多关系为例，有2种情况。
1，在部门管理预览菜单中配置，部门是主表，将员工表设为从表，主表名称可不设置，默认是当前源码菜单Tree, 生成源码后，将在部门菜单下多出一个AsideTree菜单；
2，如果在员工管理预览菜单中配置，主表设置在主表名称，从表可不设置，默认取当前源码目前中列表菜单作从表信息展示 ，生成源码后，将在员工菜单下多出一个AsideTree菜单；
当然，防止出问，主从表表名，也可都设置上。
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="string">"asideTree"</span>: &#123;</span><br><span class="line">    <span class="string">"desc"</span>: <span class="string">"左树右列表结构：左树是主表，右列表是子表"</span>,</span><br><span class="line">    <span class="string">"enable"</span>: <span class="literal">true</span>,</span><br><span class="line">    <span class="string">"fatherTableName"</span>: <span class="string">"主表名称（表名, 如: tmpt_auth_user）"</span>,</span><br><span class="line">    <span class="string">"sonTableName"</span>: <span class="string">"子表名称（表名, 如: tmpt_auth_user）"</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
</code></pre><h2 id="主从表"><a href="#主从表" class="headerlink" title="主从表"></a>主从表</h2><pre><code>一，参考“侧边树查询”，道理一样。节点是otm, OneToMany的意思
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="string">"otm"</span>: &#123;</span><br><span class="line">    <span class="string">"desc"</span>: <span class="string">"OneToMany: 一对多中子表信息"</span>,</span><br><span class="line">    <span class="string">"enable"</span>: <span class="literal">true</span>,</span><br><span class="line">    <span class="string">"tableName"</span>: <span class="string">"子表名称（表名, 如: tmpt_auth_user）"</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

生成源码后，在源码目录中，多出一个菜单AsideO2M菜单。


二、主表列表页面，行尾子表查询按钮，默认点开后，是查询所有内容，代码相关调整参数如下：
1，主表行尾菜单
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&lt;router-link :to=<span class="string">"'/dev-tool/a2user/list/'+row.id"</span>&gt;</span><br><span class="line">  &lt;el-button <span class="built_in">type</span>=<span class="string">"primary"</span> size=<span class="string">"mini"</span>&gt;</span><br><span class="line">    员工列表</span><br><span class="line">  &lt;/el-button&gt;</span><br><span class="line">&lt;/router-link&gt;</span><br></pre></td></tr></table></figure>

2，修改路由：子页面的增加路由 route
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  path: <span class="string">'list/:a2deptId(\\d+)'</span>,  // 关键点， 接收外键</span><br><span class="line">  name: <span class="string">'a2user-list'</span>,</span><br><span class="line">  hidden: <span class="literal">true</span>,  // 关键点， 隐藏菜单</span><br><span class="line">  component: () =&gt; import(<span class="string">'@/views/coding/a2user/list'</span>),</span><br><span class="line">  meta: &#123;</span><br><span class="line">    title: <span class="string">'UserList'</span>,</span><br><span class="line">    icon: <span class="string">'table'</span>,</span><br><span class="line">    cache: <span class="literal">true</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;,</span><br></pre></td></tr></table></figure>

3，子列表页取路由参数 vue create() 
在create或mount方法中，取外键参数，进行查询
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">const a2deptId = this.<span class="variable">$route</span>.params &amp;&amp; this.<span class="variable">$route</span>.params.a2deptId</span><br><span class="line"><span class="keyword">if</span> (a2deptId !== undefined) &#123;</span><br><span class="line">  this.listQuery.a2deptId = a2deptId</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

需要注意的是：    
在主表的mapper.xml中，实时加载了从表列表，进行页面展示，如不需要此功能，可在mapper.xml中按说明取消。
实时加载后的主表列表效果如下：
</code></pre><p><img src="./images/o2m.png" width="1000"></p>
<h2 id="关于删除标志Deleteflag"><a href="#关于删除标志Deleteflag" class="headerlink" title="关于删除标志Deleteflag"></a>关于删除标志Deleteflag</h2><pre><code>生成的后端源码controller中，判断当deleteflag为空时，设置了默认值：0（查有效的记录）。所以当使用deleteflag作为查询条件时，需要手动在controller中删除此项。
page()、myPage()等查询方法中默认是只查有效的记录，不需要话，可删除以下代码
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span>(a2dept.getDeleteflag()==null)&#123;</span><br><span class="line">    a2dept.setDeleteflag(0);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
</code></pre><h2 id="枚举对象"><a href="#枚举对象" class="headerlink" title="枚举对象"></a>枚举对象</h2><pre><code>以deleteflag为例，deleteflag是枚举对象，在bean中是Integer类型， 在dto中通过dozer转化成对象类型。
1，在做select查询条件中，dto.deleteflag = 0 -&gt; bean.deleteflag=0
2，在返回的结果集中：bean.deleteflag=0 -&gt; dto.deleteflag={id:0, name:有效}；
备注：
bean: 实体对象
dto: 数据传输对象
dozer: bean与dto之间转换工具
</code></pre><h2 id="页面版本号控制"><a href="#页面版本号控制" class="headerlink" title="页面版本号控制"></a>页面版本号控制</h2><pre><code>通过页面设置功能，远程存储了用户自定义显示的列数组，这些参数只在complex-list.vue, complex-list-line-edit.vue中有效。
这样页面级升级功能，通过data.pageVersion控制
1，当新开发页面与老页面版本号相同时：当页面增加新的开发需求，增加了新属性时，默认是不显示的，需要用户通过页面设置选择加载。
2，增加页面版本号，强制页面配置参数重置，进入初始状态，显示所有信息，用户需要重新通过页面设置进行自定义布局。
</code></pre><h2 id="页面按钮权限控制"><a href="#页面按钮权限控制" class="headerlink" title="页面按钮权限控制"></a>页面按钮权限控制</h2><pre><code>操作BUTTON上， 加v-show绑定事件hasPermission, 如：hasPermission([&apos;a2company:update&apos;,&apos;a2company:delete&apos;])
</code></pre><h2 id="列表高度自适应"><a href="#列表高度自适应" class="headerlink" title="列表高度自适应"></a>列表高度自适应</h2><pre><code>解决每页显示记录数、列数过多，Windows下浏览器，X轴滚动条不好控制的问题。
列表页中，不管你怎么调整页面大小，table高度自适应；
使用element-resize-detector，对元素尺寸变化进行监控。
</code></pre>
        <div id="react-support-footer-root"></div>
      </div>
    </div>
  </div>
</div>

    


    

    <!-- js vendors -->
    <script src="//code.jquery.com/jquery-3.2.1.min.js" crossorigin="anonymous"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/lunr.js/2.1.0/lunr.min.js"></script>

    <!-- js source  -->
    <script src="/ejdoc/script/doc.js"></script>

    

  </body>
</html>
